package org.study.async;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.*;

/**
 * 作用描述
 *
 * @author doveylovey
 * @version v1.0.0
 * @email 1135782208@qq.com
 * @date 2024年08月08日
 */
@Slf4j
public class CompletableFutureTest04 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        completableFutureTest01();
    }

    /**
     * CompletableFuture异步执行多任务并返回结果
     */
    public static void completableFutureTest01() throws ExecutionException, InterruptedException {
        // 创建多个CompletableFuture对象
        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
            log.info("任务1 -- 开始");
            try {
                // 模拟长时间运行的任务1
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("任务1 -- 结束");
            return "任务1的结果";
        });
        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
            log.info("任务2 -- 开始");
            try {
                // 模拟长时间运行的任务2
                TimeUnit.SECONDS.sleep(7);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("任务2-- 结束");
            return "任务2的结果";
        });
        CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
            log.info("任务3 -- 开始");
            try {
                // 模拟长时间运行的任务3
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("任务3 -- 结束");
            return "任务3的结果";
        });
        // 使用CompletableFuture的thenApply方法处理每个任务的结果
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3)
                .thenApply((result) -> {
                    try {
                        // 获得future1的结果
                        String s = future1.get();
                        System.out.println(s);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    try {
                        // 获得future2的结果
                        String s = future2.get();
                        System.out.println(s);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    try {
                        // 获得future3的结果
                        String s = future3.get();
                        System.out.println(s);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println("所有任务都完成了");
                    // thenApply返回值必须是void，所以返回null
                    return null;
                });
        // 阻塞等待所有任务完成
        allFutures.get();
    }
}
